package io.github.wangtisnruipopo.carscore.types;

import java.util.List;

/**
 * <h1>回合接口</h1>
 *
 * @param <D> 花色类型
 * @param <V> 牌数值类型
 * @param <C> 卡牌类型
 * @param <P> 玩家类型
 */
public interface IRound<
        D extends AbsDecorValue,
        V extends AbsCardValue,
        C extends ISimpleCard<D, V>,
        P extends IPlayer<D, V, C>,
        R extends IPlayCardsRecord<D, V, ? extends IPlayCardsType<C>, C, P>>
        extends IAppointPlay {
    /**
     * <h2>获取本回合的回合数</h2>
     *
     * @return 回合数
     */
    int getIndex();

    /**
     * <h2>获取当前行动的玩家</h2>
     *
     * @return 当前行动的玩家对象
     */
    P getCurrentActionPlayer();

    /**
     * <h2>获取本回合所有的参与者</h2>
     *
     * @return 本回合所有的参与者对象集合
     */
    List<P> getParticipant();

    /**
     * <h2>本回合所有的出牌记录</h2>
     *
     * @return 出牌记录集合
     */
    List<R> getRecords();

    /**
     * <h2>创建完成后的回调函数</h2>
     */
    void afterCreate();

    void setRoundEnd(IEnd roundEnd);

    /**
     * <h2>进行下一位玩家的行动</h2>
     */
    void next();

}
